home *** CD-ROM | disk | FTP | other *** search
- (*
-
-
- Hi..
-
- This Unit is made all by myself, And There may be some problems with it, If
- so please let me know..
-
- All the routines that are present here come from one big unit that i have,
- so there could be something missing( but as i said, just let me know))
-
- there are some thing You have to keep in Mind when you are using these
- routines, But i will go over them..
-
- There are routines where the x coordinate isn't 640 but 80 (Like Text),
- I've done this because I use 8x8 Text. (I now know that it isn't very hard
- for me to change it so you can put a char on every x-coordinate, But i don't
- feel much like it at the moment, Maybe in a couple of days))
-
- Oh Yeah, None of my routines check if the coordinates are correct..
-
- Andre Jakobs
- MicroBrain Technologies Inc.
- The Netherlands
-
-
- Procedure Plot12h(x,y:word;Color:byte);
- {x (0-639)
- y (0-479)
- Color (0-15)
- Plots a pixel in [Color] at [x],[y]}
- Procedure HLine12h(x,y,Length:word;Color:byte);
- {x (0-639)
- y (0-479)
- Length (0-639)(But can of course be larger, cause there is no checking)
- Color (0-15)
- Draws a horizontal Line in [Color] at [x],[y]}
- Procedure VLine12h(x,y,Length:word;Color:byte);
- {x (0-639)
- y (0-479)
- Length (0-479)
- Color (0-15)
- Draws a vertical Line in [Color] at [x],[y]}
- Procedure Block12h(x,y,Width,Height:word;Color:byte);
- {x (0-639)
- y (0-479)
- Width (0-639)
- Height (0-479)
- Color (0-15)
- Draws a Box in [Color] at [x],[y] wich is [Width] Wide and [Height] High}
- Procedure Frame12h(x,y,Width,Height:word;Color:byte);
- {x (0-639)
- y (0-479)
- Width (0-639)
- Height (0-479)
- Color (0-15)
- Draws a Frame in [Color] at [x],[y] wich is [Width] Wide and [Height] High}
- Procedure PutChar12h(x,y:word;color:byte;cha:char);
- {x (0-79) !!!
- y (0-479)
- Color (0-15)
- cha ('Character')
- Puts a character in [Color] at [x],[y]
- Doesn't erase background, So if there already is a character use block to
- erase it.
- example:
- Block(50 shl 3,100,8,8,1);
- ^^^^^^^^ (50 is the x coordinate that is used for the char
- but because block uses 0-639 and not (0-79) you
- have to multiply it by 8 (shl 3))
- PutChar(50,100,7,'A');}
- Procedure PutString12h(x,y:word;Color:byte;Str:String);
- {x (0-79) !!!
- y (0-479)
- Color (0-15)
- Str ('String')
- Puts a String in [Color] at [x],[y]
- Doesn't erase background, So if there already is a String use block to
- erase it.
- example:
- Block(50 shl 3,100,Length(String) shl 8,8,1);
- ^^^^^^^^ (50 is the x coordinate that is used for the char
- but because block uses 0-639 and not (0-79) you
- have to multiply it by 8 (shl 3))
- PutString(50,100,7,'A');}
- Procedure Window12h(x,y,Width,Height:word;Color0,Color1,Color2:byte);
- {x (0-79) !!!
- y (0-479)
- Width (0-79) !!!
- Height (0-479)
- Color1 (0-15) (Darkest Color)
- Color2 (0-15) (Window Main Color)
- Color3 (0-15) (Lightest Color)
- Draws a Window at [x],[y] wich is [Width] Wide and [Height] High
- example:
- Window12h(9,89,39,79,8,7,15)
- }
- Procedure CloseWindow12h;
- {closes Last opened Window, there is a max of 16 windows at the moment, But you
- can increase it if you want}
- Procedure SaveScreen12h;
- {Saves a complete Mode 12h Screen}
- Procedure RestoreScreen12h;
- {Restores Screen that is saved using SaveScreen12h}
-
- Procedure Mode12h;{640x480x16, write mode 2}
- {Sets Up mode 12h}
- Procedure Button(x,y,W,H:Word;Color0,Color1,Color2:byte);
- {x (0-639)
- y (0-479)
- Width (0-639)
- Height (0-479)
- Color1 (0-15) (Darkest Color)
- Color2 (0-15) (Window Main Color)
- Color3 (0-15) (Lightest Color)
- Draws a Button at [x],[y] wich is [Width] Wide and [Height] High
- }
-
- Procedure LoadFont;
- {This Loads a 8x8 Font into an array '_8x8P' that is used to display the text
- You can optain this font by saving the 8x8 ROM font to a binary file and then
- load it into this array.. (you can use a font util to save the font to disk
- try some at (x2ftp.oulu.fi msdos/programming, and search for something that
- has the name 2l8 (Too Late) font editor v1.20)},
- Or you can load the _8x8Seg,_8x8Ofs with the Segment and Offset to the VGA 8x8
- ROM Font..
-
- Hope You can use these routines, Cause I use them alot now (Don't use textmode
- anymore, But this Mode)..
-
- *)
- UNIT VGA_12h;
-
- INTERFACE
- USES CRT,DOS;
- Type
- PlotProc =Procedure(x,y:word;Color:byte);
- HLineProc =Procedure(x,y,Length:word;Color:byte);
- VLineProc =Procedure(x,y,Length:word;Color:byte);
- BlockProc =Procedure(x,y,Width,Height:word;Color:byte);
- FrameProc =Procedure(x,y,Width,Height:word;Color:byte);
- PutCharProc =Procedure(x,y:word;color:byte;cha:char);
- PutStringProc=Procedure(x,y:word;Color:byte;Str:String);
-
- var
- Result : word;
-
- {Procedures}
- ClrScr : Procedure; {Clear Screen}
- Plot : PlotProc; {Plot(x,y,Color)}
- HLine : HLineProc; {HorizontalLine(x,y,Length,Color)}
- VLine : VLineProc; {VerticalLine(x,y,Length,Color)}
- Block : BlockProc; {Block(x,y,Width,Height,Color)}
- Frame : FrameProc;
- PutChar : PutCharProc; {PutCharacter(x,y,Color,Char)}
- PutString : PutStringProc; {PutString(x,y,Color,String)}
- SaveScreen : Procedure; {SaveScreen}
- RestoreScreen: Procedure; {RestoreScreen}
-
- {Mode 12h Routines}
- Procedure Plot12h(x,y:word;Color:byte);
- Procedure HLine12h(x,y,Length:word;Color:byte);
- Procedure VLine12h(x,y,Length:word;Color:byte);
- Procedure Block12h(x,y,Width,Height:word;Color:byte);
- Procedure Frame12h(x,y,Width,Height:word;Color:byte);
- Procedure PutChar12h(x,y:word;color:byte;cha:char);
- Procedure PutString12h(x,y:word;Color:byte;Str:String);
- Procedure Window12h(x,y,Width,Height:word;Color0,Color1,Color2:byte);
- Procedure CloseWindow12h;
- Procedure SaveScreen12h;
- Procedure RestoreScreen12h;
-
- Procedure Mode12h;{640x480x16, write mode 2}
- Procedure Button(x,y,W,H:Word;Color0,Color1,Color2:byte);
-
- IMPLEMENTATION
-
- Type
- Window12hType = record
- Width : byte;
- Height: word;
- VidOfs: word;
- Plane0: pointer;
- Plane1: pointer;
- Plane2: pointer;
- Plane3: pointer;
- end;
- Var
- WindowList12h : Array [1..16] of ^Window12hType;
- LastWindow12h : byte;
- ScreenGrab : Array [0..3] of pointer;
- _8x8Seg,_8x8Ofs : word;
- _8x8P : Array [0..2048] of byte;
-
- {*****************************************************************
- GRAPHICS & TEXT ROUTINES
- *****************************************************************}
- Procedure LoadFont;
- var
- F : file;
- begin
- assign(F,'8x8');
- reset(F,1);
- blockread(f,_8x8P[0],2048);
- close(F);
- _8x8Seg:=Seg(_8x8P[0]);
- _8x8Ofs:=Ofs(_8x8P[0]);
- end;
-
- Procedure Mode12h;{Assembler;{640x480x16}
- begin
- @Plot:=@Plot12h;
- @VLine:=@VLine12h;
- @HLine:=@HLine12h;
- @Block:=@Block12h;
- @Frame:=@Frame12h;
- @PutChar:=@PutChar12h;
- @PutString:=@PutString12h;
- @SaveScreen:=@SaveScreen12h;
- @RestoreScreen:=@RestoreScreen12h;
- Asm
- Mov AH,00
- Mov AL,12h
- Int 10h
- mov dx,03ceh {Graphics Controller}
- mov ax,0205h {Mode Register, Write Mode 2}
- out dx,ax
- end;
- end;
-
- Procedure Button(x,y,W,H:Word;Color0,Color1,Color2:byte);
- begin
- Block(x,y,W,H,Color1);
- HLine(x+1,y,W-2,Color2);
- VLine(x,y+1,H-2,Color2);
- HLine(x+1,y+H-1,W-1,Color0);
- VLine(x+W-1,y+1,H-1,Color0);
- end;
-
- Procedure ClrScr12h;assembler;
- asm
- mov es,SegA000
- mov di,00h
- mov ax,00h
- mov cx,19200
- rep stosw
- end;
-
- Procedure Plot12h(x,y:word;Color:byte); assembler;
- asm
- mov ax,SegA000 {Calculate Offset}
- mov es,ax
- mov bx,[y]
- mov di,bx
- shl di,6 {80*y}
- shl bx,4
- add di,bx
-
- mov cx,[x]
- mov bx,cx
- shr bx,3 {/8}
- add di,bx {80*y+ (x/8)}
-
- and cx,7 {Get Bit that Changes}
- mov ah,128
- shr ah,cl
- mov dx,03ceh
- mov al,8
- out dx,ax
- mov dl,[es:di]
- mov al,[Color]
- mov [es:di],al
- end;
-
- Procedure HLine12h(x,y,Length:word;Color:byte);Assembler;
- asm
- mov bx,[x]
- mov si,[Length]
- or si,si {Check if Length=0}
- jz @D_End {If So then jump to End}
- mov dx,03ceh {Graphics Controller}
-
- mov ax,SegA000 {Calculate Offset}
- mov es,ax
- mov ax,[y]
- mov di,ax
- shl di,6 {80*y}
- shl ax,4
- add di,ax
-
- mov ax,bx
- shr ax,3 {/8}
- add di,ax {80*y+ (x/8)}
-
- {di = Offset in VMem}
- {Si = Length}
- {bx = x}
- {dx = Graphix Controller}
-
- {ax = empty}
- {cx = empty}
-
- mov cx,bx {Get StartBit}
- and cx,07h
-
- mov ax,si
- add ax,cx
- cmp ax,8 {Is x+Length<One Byte}
- jb @D_One
-
- mov ah,0ffh {11111111b}
- shr ah,cl {BitMask}
- mov al,8 {BitMask Register}
- out dx,ax {Write BitMask}
- mov al,[es:di]
- mov al,[Color]
- mov [es:di],al
- inc di
-
- mov al,8 {BitMask Register}
- mov ah,0ffh {BitMask}
- out dx,ax {Write BitMask}
-
- mov ax,si
- mov ch,8
- sub ch,cl
- mov cl,ch
- xor ch,ch
- sub ax,cx
- shr ax,3 {Length div 8}
- mov cx,ax
- mov al,[Color]
- rep stosb
-
- mov cx,bx {cx:=x+Length}
- add cx,si
- and cx,07h {cx and 07}
- mov ah,0ffh
- shr ah,cl {BitMask}
- cmp ah,0
- je @D_End
-
- not ah
- mov al,8 {BitMask Register}
- out dx,ax {Write BitMask}
- mov cl,[es:di]
- mov al,[Color]
- mov [es:di],al
- jmp @D_End
-
- @D_One:
- mov ah,0ffh
- shr ah,cl {Left BitMask}
-
- add bx,si
- dec bx
- and bx,07h
-
- mov cx,7
- sub cx,bx
-
- mov bl,0ffh
- shl bl,cl {Right BitMask}
-
- and ah,bl {Full BitMask}
- mov al,8 {BitMask Register}
- out dx,ax {Write BitMask}
-
- mov dl,[es:di] {Fill Latches}
- mov al,[Color]
- mov [es:di],al {Write Pixel}
- @D_End:
- end;
-
- Procedure VLine12h(x,y,Length:word;Color:byte);Assembler;
- asm
- mov ax,SegA000 {Calculate Offset}
- mov es,ax
- mov bx,[y]
- mov di,bx
- shl di,6 {80*y}
- shl bx,4
- add di,bx
-
- mov cx,[x]
- mov bx,cx
- shr bx,3 {/8}
- add di,bx {80*y+ (x/8)}
-
- and cx,7 {Get Bit that Changes}
- mov ah,80h
- shr ah,cl {BitMask Value}
- mov dx,03ceh {Graphics Controller}
- mov al,8 {BitMask Register}
- out dx,ax {BitMask Setup}
- mov bx,[Length]
- mov al,[Color]
- @D_L:
- mov dl,[es:di]
- mov [es:di],al {Put Byte at Offset}
- add di,80
- dec bx
- jnz @D_L
- end;
-
- Procedure Block12h(x,y,Width,Height:word;Color:byte);Assembler;
- asm
- mov bx,[x]
- mov si,[Width]
- or si,si {Check if Length=0}
- jz @D_End {If So then jump to End}
-
- mov ax,SegA000 {Calculate Offset}
- mov es,ax
- mov ax,[y]
- mov di,ax
- shl di,6 {80*y}
- shl ax,4
- add di,ax
-
- mov ax,bx
- shr ax,3 {/8}
- add di,ax {80*y+ (x/8)}
-
- {di = Offset in VMem}
- {Si = Length}
- {bx = x}
- {dx = Graphix Controller}
-
- {ax = empty}
- {cx = empty}
-
- mov cx,bx {Get StartBit}
- and cx,07h
-
- mov ax,si
- add ax,cx
- cmp ax,8 {Is x+Length<One Byte}
- jb @D_One
-
- mov ah,0ffh {11111111b}
- shr ah,cl {BitMask}
- mov al,8 {BitMask Register}
- mov dx,03ceh {Graphics Controller}
- out dx,ax {Write BitMask}
- push cx
- mov ah,[Color]
- mov cx,[Height]
- mov dx,di
- @D_LL: {Draw Left of Box}
- mov al,[es:di]
- mov [es:di],ah
- add di,80 {di:=di+80}
- dec cx
- jnz @D_LL
- mov di,dx
- inc di
- pop cx
-
- mov al,8 {BitMask Register}
- mov ah,0ffh {BitMask}
- mov dx,03ceh {Graphics Controller}
- out dx,ax {Write BitMask}
-
- mov ax,si
- mov ch,8
- sub ch,cl
- mov cl,ch
- xor ch,ch
- sub ax,cx
- shr ax,3 {Length div 8}
-
- push di
- push bx
- mov bx,[Height]
- mov dx,ax
- mov al,[Color]
- @D_LC:
- mov cx,dx
- rep stosb
- add di,80
- sub di,dx
- dec bx
- jnz @D_LC
- pop bx
- pop di
- add di,dx
-
- mov cx,bx {cx:=x+Length}
- add cx,si
- and cx,07h {cx and 07}
- mov ah,0ffh
- shr ah,cl {BitMask}
- cmp ah,0
- je @D_End
-
- not ah
- mov al,8 {BitMask Register}
- mov dx,03ceh {Graphics Controller}
- out dx,ax {Write BitMask}
- mov cx,[Height]
- mov al,[Color]
- @D_LR:
- mov ah,[es:di]
- mov [es:di],al
- add di,80
- dec cx
- jnz @D_LR
-
- jmp @D_End
-
- @D_One:
- mov ah,0ffh
- shr ah,cl {Left BitMask}
-
- add bx,si
- dec bx
- and bx,07h
-
- mov cx,7
- sub cx,bx
-
- mov bl,0ffh
- shl bl,cl {Right BitMask}
-
- and ah,bl {Full BitMask}
- mov al,8 {BitMask Register}
- mov dx,03ceh {Graphics Controller}
- out dx,ax {Write BitMask}
- mov cx,[Height]
- mov al,[Color]
- @D_L:
- mov dl,[es:di] {Fill Latches}
- mov [es:di],al {Write Pixel}
- add di,80
- dec cx
- jnz @D_L
- @D_End:
- end;
-
- Procedure Frame12h(x,y,Width,Height:word;Color:byte);
- begin
- HLine(x,y,Width,Color);
- VLine(x,y,Height,Color);
- VLine(x+Width-1,y,Height,Color);
- HLine(x,y+Height-1,Width,Color);
- end;
-
- Procedure PutChar12h(x,y:word;Color:byte;cha:char);Assembler;
- asm
- push ds
- xor bx,bx
- mov bl,[cha]
- shl bx,3
- mov ax,_8x8Seg
- mov ds,ax
- mov si,_8x8Ofs
- add si,bx
-
- mov ax,SegA000 {Calculate Offset}
- mov es,ax
- mov di,[y]
- mov ax,di
- shl ax,6
- shl di,4
- add di,ax
- add di,[x]
- mov cx,8
- mov dx,03ceh
- mov al,8
- mov bl,[Color]
- @D_L:
- mov ah,[ds:si]
- out dx,ax
- mov ah,[es:di]
- mov [es:di],bl
- inc si
- add di,80
- dec cx
- jnz @D_L
- pop ds
- end;
-
- Procedure PutString12h(x,y:word;Color:byte;Str:String);
- var
- f1 : byte;
- Cha : char;
- begin
- for f1:=1 to ord(Str[0]) do
- begin
- cha:=Str[f1];
- asm
- push ds
- mov ax,_8x8Seg
- mov ds,ax
- mov si,_8x8Ofs
- xor ax,ax
- mov al,cha
- shl ax,3
- add si,ax
-
- mov ax,SegA000 {Calculate Offset}
- mov es,ax
- mov di,[y]
- mov ax,di
- shl ax,6
- shl di,4
- add di,ax
- add di,[x]
- mov cx,8
- mov dx,03ceh
- mov al,8
- mov bl,[Color]
- @D_L:
- mov ah,[ds:si]
- out dx,ax
- mov ah,[es:di]
- mov [es:di],bl
- inc si
- add di,80
- dec cx
- jnz @D_L
- pop ds
- end;
- inc(x);
- end;{For}
- end;
-
- Procedure Window12h(x,y,Width,Height:word;Color0,Color1,Color2:byte);
- var
- VidOfs : word;
- ImOfs,ImSeg : word;
- ScrW : word;
- O0,S0,O1,S1 : word;
- O2,S2,O3,S3 : word;
- begin
- if LastWindow12h<16 then
- begin
- inc(LastWindow12h);
- new(WindowList12h[LastWindow12h]);
- VidOfs:=(y shl 6)+(y shl 4)+x;
- WindowList12h[LastWindow12h]^.VidOfs:=VidOfs;
- WindowList12h[LastWindow12h]^.Width :=Width;
- WindowList12h[LastWindow12h]^.Height:=Height;
- ScrW:=Width*Height;
- GetMem(WindowList12h[LastWindow12h]^.Plane0,ScrW);
- GetMem(WindowList12h[LastWindow12h]^.Plane1,ScrW);
- GetMem(WindowList12h[LastWindow12h]^.Plane2,ScrW);
- GetMem(WindowList12h[LastWindow12h]^.Plane3,ScrW);
- S0:=Seg(WindowList12h[LastWindow12h]^.Plane0^);
- O0:=Ofs(WindowList12h[LastWindow12h]^.Plane0^);
- S1:=Seg(WindowList12h[LastWindow12h]^.Plane1^);
- O1:=Ofs(WindowList12h[LastWindow12h]^.Plane1^);
- S2:=Seg(WindowList12h[LastWindow12h]^.Plane2^);
- O2:=Ofs(WindowList12h[LastWindow12h]^.Plane2^);
- S3:=Seg(WindowList12h[LastWindow12h]^.Plane3^);
- O3:=Ofs(WindowList12h[LastWindow12h]^.Plane3^);
- ScrW:=80-Width;
- asm
- push ds
-
- mov bx,[Width]
- mov cx,[Height]
-
- mov si,[VidOfs]
- mov ds,SegA000 {ds:si VideoMem}
- mov dx,03ceh {Graphics Controller}
- mov ax,0005h {Mode Register, Write 0, Read 0}
- out dx,ax
-
-
- mov di,[O3] {Read Plane 3}
- mov es,[S3] {es:di ImageOfset}
- mov ax,0304h {Read Plane Select}
- out dx,ax
- push si {Save 'Start Window in VideoMem'}
- push cx
- mov ax,cx {cx=Height}
- @B3:
- mov cx,bx {bx=Width}
- rep movsb {Read 8 Pixels}
- add si,[ScrW] {Goto Next Line by adding ScrWidth}
- dec ax
- jnz @B3
- pop cx
- pop si {Restore 'Start Window in VideoMem'}
-
- mov di,[O2] {Read Plane 2}
- mov es,[S2] {es:di ImageOfset}
- mov ax,0204h {Read Plane Select}
- out dx,ax
- push si {Save 'Start Window in VideoMem'}
- push cx
- mov ax,cx {cx=Height}
- @B2:
- mov cx,bx {bx=Width}
- rep movsb {Read 8 Pixels}
- add si,[ScrW] {Goto Next Line by adding ScrWidth}
- dec ax
- jnz @B2
- pop cx
- pop si {Restore 'Start Window in VideoMem'}
-
-
- mov di,[O1] {Read Plane 1}
- mov es,[S1] {es:di ImageOfset}
- mov ax,0104h {Read Plane Select}
- out dx,ax
- push si {Save 'Start Window in VideoMem'}
- push cx
- mov ax,cx {cx=Height}
- @B1:
- mov cx,bx {bx=Width}
- rep movsb {Read 8 Pixels}
- add si,[ScrW] {Goto Next Line by adding ScrWidth}
- dec ax
- jnz @B1
- pop cx
- pop si {Restore 'Start Window in VideoMem'}
-
-
- mov di,[O0] {Read Plane 0}
- mov es,[S0] {es:di ImageOfset}
- mov ax,0004h {Read Plane Select}
- out dx,ax
- mov ax,cx {cx=Height}
- @B0:
- mov cx,bx {bx=Width}
- rep movsb {Read 8 Pixels}
- add si,[ScrW] {Goto Next Line by adding ScrWidth}
- dec ax
- jnz @B0
-
- mov ax,0205h {Mode Register, Write Mode 2}
- out dx,ax
- pop ds
- end;
- Width:=Width shl 3;
- x:=x shl 3;
- Block(x,y,Width,Height,Color1);
- HLine(x+1,y,Width-2,Color2);
- VLine(x,y+1,Height-2,Color2);
- HLine(x+1,y+Height-1,Width-1,Color0);
- VLine(x+width-1,y+1,Height-1,Color0);
- end;
- end;
-
- Procedure CloseWindow12h;
- var
- Width,Height : word;
- SegWin,OfsWin : word;
- OfsVid : word;
- ScrW : word;
- O0,S0,O1,S1 : word;
- O2,S2,O3,S3 : word;
- begin
- if LastWindow12h>0 then
- begin
- Width:=WindowList12h[LastWindow12h]^.Width;
- Height:=WindowList12h[LastWindow12h]^.Height;
- OfsVid:=WindowList12h[LastWindow12h]^.VidOfs;
-
- S0:=Seg(WindowList12h[LastWindow12h]^.Plane0^);
- O0:=Ofs(WindowList12h[LastWindow12h]^.Plane0^);
- S1:=Seg(WindowList12h[LastWindow12h]^.Plane1^);
- O1:=Ofs(WindowList12h[LastWindow12h]^.Plane1^);
- S2:=Seg(WindowList12h[LastWindow12h]^.Plane2^);
- O2:=Ofs(WindowList12h[LastWindow12h]^.Plane2^);
- S3:=Seg(WindowList12h[LastWindow12h]^.Plane3^);
- O3:=Ofs(WindowList12h[LastWindow12h]^.Plane3^);
- ScrW:=80-Width;
- Asm
- push ds
- {GET OFFSET IN VIDEOMEM/MOUSEBACKUP}
-
- mov bx,[Width]
- mov cx,[Height]
- mov es,SegA000
- mov di,[OfsVid] {es:di Start in VideoMem}
- mov dx,03ceh {Graphics Controller}
- mov ax,0805h {Mode Register, Write Mode 0, Read Mode
- 1}
- out dx,ax
- mov ax,0007h {color don't care Register}
- out dx,ax
- mov ax,0ff08h {BitMask Register}
- out dx,ax
- mov dx,03c4h {Sequencer Controller}
-
- cli
- mov si,[O3]
- mov ds,[S3] {ds:si Start in Memory}
- mov ax,0802h {Write Plane Select,Plane 3}
- out dx,ax {Write Read Plane Select}
- push di {Save 'Start Window in VideoMem'}
- mov ax,[Height] {Height}
- @R3:
- mov cx,bx {bx=Width}
- rep movsb {Draw 8 Pixels}
- add di,[ScrW] {Goto Next Line by adding ScrWidth}
- dec ax
- jnz @R3
- pop di {Restore 'Start Window in VideoMem'}
-
-
- mov si,[O2]
- mov ds,[S2] {ds:si Start in Memory}
- mov ax,0402h {Write Plane Select,Plane 2}
- out dx,ax {Write Read Plane Select}
- push di {Save 'Start Window in VideoMem'}
- mov ax,[Height] {Height}
- @R2:
- mov cx,bx {bx=Width}
- rep movsb {Draw 8 Pixels}
- add di,[ScrW] {Goto Next Line by adding ScrWidth}
- dec ax
- jnz @R2
- pop di {Restore 'Start Window in VideoMem'}
-
- mov si,[O1]
- mov ds,[S1] {ds:si Start in Memory}
- mov ax,0202h {Write Plane Select,Plane 1}
- out dx,ax {Write Read Plane Select}
- push di {Save 'Start Window in VideoMem'}
- mov ax,[Height] {Height}
- @R1:
- mov cx,bx {bx=Width}
- rep movsb {Draw 8 Pixels}
- add di,[ScrW] {Goto Next Line by adding ScrWidth}
- dec ax
- jnz @R1
- pop di {Restore 'Start Window in VideoMem'}
-
- mov si,[O0]
- mov ds,[S0] {ds:si Start in Memory}
- mov ax,0102h {Write Plane Select,Plane 2}
- out dx,ax {Write Read Plane Select}
- mov ax,[Height] {Height}
- @R0:
- mov cx,bx {bx=Width}
- rep movsb {Draw 8 Pixels}
- add di,[ScrW] {Goto Next Line by adding ScrWidth}
- dec ax
- jnz @R0
-
- mov ax,0f02h {Set All Planes to write}
- out dx,ax
-
- mov dx,03ceh {Graphics Controller}
- mov ax,0205h {Mode Register, Write Mode 2}
- out dx,ax
- sti
- pop ds
- end;
- ScrW:=Width*Height;
- FreeMem(WindowList12h[LastWindow12h]^.Plane0,ScrW);
- FreeMem(WindowList12h[LastWindow12h]^.Plane1,ScrW);
- FreeMem(WindowList12h[LastWindow12h]^.Plane2,ScrW);
- FreeMem(WindowList12h[LastWindow12h]^.Plane3,ScrW);
- Dispose(WindowList12h[LastWindow12h]);
- dec(LastWindow12h);
- end;
- end;
-
- Procedure SaveScreen12h;
- var
- O0,S0,O1,S1 : word;
- O2,S2,O3,S3 : word;
- begin
- GetMem(ScreenGrab[0],38592);{80*480+64*3(Palet)}
- GetMem(ScreenGrab[1],38400);{80*480}
- GetMem(ScreenGrab[2],38400);{80*480}
- GetMem(ScreenGrab[3],38400);{80*480}
-
- S0:=Seg(ScreenGrab[0]^);
- O0:=Ofs(ScreenGrab[0]^);
-
- S1:=Seg(ScreenGrab[1]^);
- O1:=Ofs(ScreenGrab[1]^);
-
- S2:=Seg(ScreenGrab[2]^);
- O2:=Ofs(ScreenGrab[2]^);
-
- S3:=Seg(ScreenGrab[3]^);
- O3:=Ofs(ScreenGrab[3]^);
- asm
- push ds
-
- mov di,[O3]
- mov es,[S3]
- {es:di ImageOfset}
- mov ds,SegA000
- xor si,si
- {ds:si VideoMem}
- mov dx,03ceh {Graphics Controller}
- mov ax,0005h {Mode Register, Write 0, Read 0}
- out dx,ax
- mov ax,0304h {Read Plane Select}{Plane 3}
- out dx,ax
- mov cx,19200
- rep movsw
-
- mov es,[S2]
- mov di,[O2]
- xor si,si
- dec ah {Plane 2}
- out dx,ax
- mov cx,19200
- rep movsw
-
- mov es,[S1]
- mov di,[O1]
- xor si,si
- dec ah {Plane 1}
- out dx,ax
- mov cx,19200
- rep movsw
-
- mov es,[S0]
- mov di,[O0]
- xor si,si
- dec ah {Plane 0}
- out dx,ax
- mov cx,19200
- rep movsw
-
- mov dx,03ceh {Graphics Controller}
- mov ax,0205h {Mode Register, Write Mode 2}
- out dx,ax
-
- mov dx,03c7h {Save Palette behind Plane 0}
- mov al,0
- out dx,al
- mov dx,03c9h
- mov cx,192 {64 Colors RxGxB starting}
- rep insb
- pop ds
- end;
- end;
-
- Procedure RestoreScreen12h;
- var
- O0,S0,O1,S1 : word;
- O2,S2,O3,S3 : word;
- Label
- C1,C2,rt1,rt2;
- begin
- S0:=Seg(ScreenGrab[0]^);
- O0:=Ofs(ScreenGrab[0]^);
-
- S1:=Seg(ScreenGrab[1]^);
- O1:=Ofs(ScreenGrab[1]^);
-
- S2:=Seg(ScreenGrab[2]^);
- O2:=Ofs(ScreenGrab[2]^);
-
- S3:=Seg(ScreenGrab[3]^);
- O3:=Ofs(ScreenGrab[3]^);
- Asm
- push ds
-
- mov dx,03c8h
- mov al,0
- out dx,al
- inc dx
- mov cx,192
- C1:
- out dx,al
- dec cx
- jnz C1
-
- mov dx,03ceh {Graphics Controller}
- mov ax,0805h {Mode Register, Write Mode 0, Read Mode 1}
- out dx,ax
- mov ax,0007h {color don't care Register}
- out dx,ax
- mov ax,0ff08h {BitMask Register}
- out dx,ax
- mov dx,03c4h {Sequencer Controller}
- {GET OFFSET IN VIDEOMEM}
- mov es,SegA000
- xor di,di
- {es:di Start in VideoMem}
- mov si,[O3]
- mov ds,[S3]
- {ds:si Start in Memory}
- mov ax,0802h {Write Plane Select}
- out dx,ax
- cli
- mov cx,19200
- rep movsw
-
- xor di,di
- {es:di Start in VideoMem}
- mov si,[O2]
- mov ds,[S2]
- {ds:si Start in Memory}
- mov ax,0402h {Write Plane Select}
- out dx,ax
- mov cx,19200
- rep movsw
-
- xor di,di
- {es:di Start in VideoMem}
- mov si,[O1]
- mov ds,[S1]
- {ds:si Start in Memory}
- mov ax,0202h {Write Plane Select}
- out dx,ax
- mov cx,19200
- rep movsw
-
- xor di,di
- {es:di Start in VideoMem}
- mov si,[O0]
- mov ds,[S0]
- {ds:si Start in Memory}
- mov ax,0102h {Write Plane Select}
- out dx,ax
- mov cx,19200
- rep movsw
- sti
- mov ax,0f02h {Set All Planes to write}
- out dx,ax
-
- mov dx,03ceh {Graphics Controller}
- mov ax,0205h {Mode Register, Write Mode 2}
- out dx,ax
-
- mov dx,03c8h
- mov al,0
- out dx,al
- inc dx
- mov cx,192
- rep outsb
- pop ds
- end;
- FreeMem(ScreenGrab[3],38400);{80*480}
- FreeMem(ScreenGrab[2],38400);{80*480}
- FreeMem(ScreenGrab[1],38400);{80*480}
- FreeMem(ScreenGrab[0],38592);{80*480+64*3}
- end;
-
- begin
- LastWindow12h:=0;
- LoadFont;
- end.